package com.leetcode;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 284. 窥探迭代器
 *
 * @author yml
 * 请你设计一个迭代器，除了支持 hasNext 和 next 操作外，还支持 peek 操作。
 * <p>
 * 实现 PeekingIterator 类：
 * <p>
 * PeekingIterator(int[] nums) 使用指定整数数组 nums 初始化迭代器。
 * int next() 返回数组中的下一个元素，并将指针移动到下个元素处。
 * bool hasNext() 如果数组中存在下一个元素，返回 true ；否则，返回 false 。
 * int peek() 返回数组中的下一个元素，但 不 移动指针。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/peeking-iterator
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class LeetCode284 {

    public static void main(String[] arg0) {

        List<String> testList = new ArrayList<>();
        testList.add("123");
        testList.add("abc");
        testList.add("qwer");
        testList.iterator();
    }


    // Java Iterator interface reference:
    // https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html
    class PeekingIterator implements Iterator<Integer> {

        private Iterator<Integer> iterator;
        private Integer           peekEle;

        public PeekingIterator(Iterator<Integer> iterator) {
            // initialize any member here.
            this.iterator = iterator;
            peekEle = iterator.next();
        }

        // Returns the next element in the iteration without advancing the iterator.
        public Integer peek() {
            return peekEle;
        }

        // hasNext() and next() should behave the same as in the Iterator interface.
        // Override them if needed.
        @Override
        public Integer next() {
            Integer nextEle = peekEle;
            peekEle = iterator.hasNext() ? iterator.next() : null;
            return nextEle;
        }

        @Override
        public boolean hasNext() {
            return peekEle != null;
        }
    }

}
